#pragma once
#include "headFiles.h"
#include "Drawer.h"
class Encoder
{
private:
	char* Str;
	int StrLength;
	//先用字节编码，版本3-L。则字符计数符的位数为8，字节容量为53，码字总数为55（bit数则*8） 
    const int TotalCodeWord = 69;
	const int FrameSize = 29;
   
	enum EnodingModeName	//3种编码模式
	{
		numeric = 0,
		alphanumeric = 1,
		byte = 2
	};

	//3种编码模式，先做字节编码
	struct EncodingMode
	{
		const EnodingModeName encodingModeName;//编码模式的名称
		const char* ModeIndicator;	//模式标识符
		const int BytesCounter;		//字符计数符的位数
		const int CapacityPerFrame;	//每张二维码的容量
	};
//	EncodingMode NumM = { numeric,"0001",10,127 };
//	EncodingMode AlphaM = { alphanumeric,"0010",9,77 };
	const EncodingMode ByteM = { byte,"0100",8, (totTotalCodeWord-2) };

	void ReadBinaryFile(const char* binaryFileName);

	//判断这张二维码应该使用哪种编码模式：数字、字符、字节
	//开始的位置为Str[startI]，包括；结束位为Str[endI]，不包括
//	EnodingModeName GetEncodingMode(int startI, int endI);

	//返回一个字符串，是这一帧的数据区比特流
	char* GetFrameBits(int startI, int endI);

	//按字节编码得到的这一帧的数据区比特流
	char* GetByteFrameBits(int startI, int endI);

	//按字符编码得到的这一帧的数据区比特流///////////////////////////////待完善//////////////////////////////
	char* GetAlphaFrameBits(int startI, int endI);
	//按数字编码得到的这一帧的数据区比特流///////////////////////////////待完善//////////////////////////////
	char* GetNumFrameBits(int startI, int endI);

public:
	Encoder();
	~Encoder();

	void WriteBinaryFile(const char* binaryFileName, const char* str, int strLength);
	void Main(const char* binaryFileName);
	//调用GetFrameBits得到这一帧的数据区比特流，再画出二维码
	void CodeFrame(int startI, int endI, int FrameNo);
};